package com.spica.platform.redis.page;

import java.util.List;

/**
 * @Description 描述
 * 分页缓存设计参照博客：https://blog.csdn.net/qq_33934427/article/details/104842979
 * 方法中存在ForHash,ForSet,ForList表示对对应的存储结构进行操作
 * List存储日期信息
 * <posts:date(固定),List<posts:YYYY-MM-dd,...>>
 * eg:
 * <posts:date, List<posts:2020-3-7, posts:2020-3-8, ...>>
 * Set存储post信息
 * <posts:YYYY-MM-dd, [PostEntity1, ....]>>
 * eg:
 * <posts:2020-3-7, [post1, post2, ...]>
 * <posts:2020-3-8, [posta, postb, ...]>
 * ....
 * Hash存储每页信息
 * <posts:pageNum, posts:YYYY-MM-dd, beginIndx:endIndex>
 * eg:
 * <posts:0, posts:2020-3-7, 0:-1>
 * <posts:0, posts:2020-3-8, 0:2>
 * <posts:1, posts:2020-3-8, 2:-1>
 * <posts:2, posts:2020-3-9, 0:-1>
 * ...
 * @Author andy
 * @Date 2024/9/15
 */
public interface PageCacheService<T> {

    /**
     * 通过检查List判断entity是否为空
     * @param userId 用户id
     * @return 是否为空
     */
    boolean isEntitiesEmptyForList(long userId);

    /**
     * 通过检查List判断当前日期下的entity是否为空
     * @param userId 用户id
     * @param date 日期
     * @return 是否为空
     */
    boolean isEntitiesEmptyForListByDate(long userId, String date);

    /**
     * 获取List中的所有日期数据数据
     * @return List中的日期数据数据
     */
    List<Object> getDatesForList(long userId);

    /**
     * 根据date插入到List中
     * @param date 插入日期
     */
    void insertDateForListByDate(long userId, String date);

    /**
     * 设置List的过期时间
     * @param minutes 分钟
     */
    void setDateExpireForListByDate(long userId, Integer minutes);

    /**
     * 设置Set中entity数据的过期时间
     * @param date 日期
     * @param minutes 过期时间
     */
    void setEntityExpireForSetByDate(long userId, String date, Integer minutes);

    /**
     * 设置Hash中分页数据的过期时间
     * @param page 页码
     * @param minutes 过期时间
     */
    void setPageExpireForHashByPage(String page, Integer minutes);

    /**
     * 从List中获取日期列表
     * @return 日期
     */
    List<Object> getDateForList(long userId);

    /**
     * 根据日期从set中获取所有entity信息
     * @param date 日期
     * @param userId 用户id
     * @return 博客信息
     */
    List<T> getEntitiesForSetByDate(String date, long userId);

    /**
     * 将数据插入到本页中，用redis的hash保存
     * 1)判断该问题是否之前遍历过，并计算size
     * 2）如果未超页，则count:indexEnd 为 size:-1。(注意size为本来问题的数目，不是遍历后剩余的size)
     * 3)如果超页，则count:indexEnd 为 size:前一个indexEnd + pageSize (注意size为本来问题的数目，不是遍历后剩余的size)
     *   并将下一个页号保存在pageData中，将其返回
     * @param pageData 分页数据对象
     * @param date 日期
     * @param entities 日期下的entity数据
     * @return 插入完成后的分页数据对象
     */
    PageData<T> insertDateForHashByPage(long userId, PageData<T>pageData, String date, List<T> entities);

    /**
     * 根据页码查询当前页的数据
     * @param userId 用户id
     * @param pageNum 页码
     * @return 当前页数据
     */
    List<T> getEntitiesByPage(long userId, int pageNum);

    /**
     * 把entity信息插入到set集合中
     * @param userId 用户id
     * @param date 数据
     * @param entity entity信息
     */
    void insertEntityForSetByDate(long userId, String date, T entity);
    String getKey(String prefix, String part1, String part2);
    String getListKey(long userId);
    String getSetKey(String date, long userId);
    String getHashKey(int pageNum, long userId);

    /**
     * 删除set中的entity信息
     * @param setKey key
     * @param entity entity信息
     */
    void removeEntityForSetByKey(String setKey, T entity);

    /**
     * 添加set中的entity信息
     * @param setKey 添加key
     * @param entity 对象
     */
    void addEntityForSetByKey(String setKey, T entity);

    /**
     * @Description: 得到pageData的基本信息
     * @Param:
     * @return:
     * @Author: wangxiaoxi
     * @Date: 2020/3/13 0013
     */
    PageData<T> getPageDataByUserId(long userId, int offset, int limit);

    /**
     * @Description: 得到pageData的基本信息
     * @Param:
     * @return:
     * @Author: wangxiaoxi
     * @Date: 2020/3/13 0013
     */
    PageData<T> getPageData(int offset, int limit);
}
